package br.com.salaodebeleza.security;

import javax.inject.Inject;

import br.com.salaodebeleza.business.TbGrupoBC;
import br.com.salaodebeleza.business.TbUsuarioBC;
import br.com.salaodebeleza.config.AppPadraoConfig;
import br.com.salaodebeleza.domain.TbGrupo;
import br.com.salaodebeleza.domain.TbUsuario;
import br.com.salaodebeleza.exception.PermissionsException;
import br.com.salaodebeleza.ws.ClienteWS;
import br.com.salaodebeleza.ws.UserLogin;
import br.gov.frameworkdemoiselle.security.Authenticator;
import br.gov.frameworkdemoiselle.security.User;

/**
 * @author daniel
 *
 */
public class MyAuthenticator implements Authenticator {

	private static final long serialVersionUID = 1L;

	@Inject
	private MyCredentials credentials;
	
	@Inject
	private TbUsuarioBC usuarioBC;
	@Inject
	private TbGrupoBC grupoBC;
	@Inject
	private AppPadraoConfig config;
	
	@Override
	public boolean authenticate() {
		String usr = credentials.getUsername();
		String pwd = credentials.getPassword();
		String sit = credentials.getSite();

		boolean authenticated = false;
		
		UserLogin usuarioLogado = new ClienteWS().loginWS(usr, pwd, sit);
		if (usuarioLogado == null) {
			authenticated = false;
			return authenticated;
		} else {
			authenticated = true;
		}
		credentials.setUsuarioLogado(usuarioLogado);
		
		TbUsuario user = usuarioBC.getByCDI(usuarioLogado.getCdi());
		if(user == null){
			user = new TbUsuario();
			user.setAtivo("S");
			user.setNome(usuarioLogado.getNome());
			user.setCdi(Integer.parseInt(usuarioLogado.getCdi()));
			TbGrupo grupo = grupoBC.getByNome(usuarioLogado.getGrupo());
			if(grupo == null && !usuarioLogado.getGrupo().trim().equals("") ){
				grupo = new TbGrupo();
				grupo.setAtivo("S");
				grupo.setNome(usuarioLogado.getGrupo().trim());
				grupoBC.insert(grupo);
			}
			user.setTbGrupo(grupo);
			usuarioBC.insert(user);
		}
		
		try {
			if(usuarioLogado.getGrupo().equalsIgnoreCase(config.getGrupoAdmin())){
				credentials.getPermissions().loadUserPermissionsAdmin(usuarioLogado.getCdi());
			}else{
				credentials.getPermissions().loadUserPermissions(usuarioLogado.getCdi());
			}
			
		} catch (NumberFormatException e) {
			e.printStackTrace();
			credentials.setPermissions(null);
		} catch (PermissionsException e) {
			e.printStackTrace();
			credentials.setPermissions(null);
		}
		
		return authenticated;
	}

	@Override
	public void unAuthenticate() {
		credentials.clear();
	}

	@Override
	public User getUser() {
		if(credentials.getUsuarioLogado() == null){
			return null;
		}
		return credentials.getUsuarioLogado().getCdi() == null ? null : credentials.getUsuarioLogado();
	}
}
